#include "si.h"

Si::Si(Sentencia *next, Expr *expr, Sentencia *instrucciones, Sentencia *sino, int fila, int col):Sentencia(next,fila,col)
{
    this->expr = expr;
    this->instrucciones=instrucciones;
    this->sino=sino;
}

Expr *Si::getExpr()
{
    return this->expr;
}

Sentencia *Si::getInstrucciones()
{
    return this->instrucciones;
}

Sentencia *Si::getSino()
{
    return this->sino;
}

void Si::setExpr(Expr *expr)
{
    this->expr=expr;
}

void Si::setInstrucciones(Sentencia *instrucciones)
{
    this->instrucciones = instrucciones;
}

void Si::setSino(Sentencia *sino)
{
    this->sino = sino;
}

string Si::is()
{
    return "SI";
}

Tipo_ts *Si::validarSemantica(Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
    Tipo_ts *tts = this->expr->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    if(tts->is().compare("BOOLEANO")==0){
        if(this->instrucciones!=0){
            this->instrucciones->validarSemantica(tabla_de_tipo,tabla_de_varaible);
        }
        if(this->sino!=0){
            this->sino->validarSemantica(tabla_de_tipo,tabla_de_varaible);
        }

    }else{
        stringstream out;
        out<<"Expreccion debe de ser booleana// Fila:"<<this->getFila()<<endl;
        throw exception(out.str().c_str());
    }

    if(this->getNext()!=0){
        this->getNext()->SetReturn(this->GetReturn());
        this->getNext()->validarSemantica(tabla_de_tipo,tabla_de_varaible);
    }
    return 0;
}

string Si::generarCodigo(GenerarVariable *var, Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
    string codigo = "if("+this->getExpr()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible).codigo+") {\n";
    if(this->getInstrucciones()!=0){
    codigo += this->getInstrucciones()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible)+"}";
    }else{
    codigo+= "\n}";
    }
    if(this->getSino()!=0){
        codigo += "else{\n"+this->getSino()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible)+"}\n";
    }else{
        codigo+= "\n";
    }

    if(this->getNext()!=0){
        codigo += this->getNext()->generarCodigo(var,tabla_de_tipo,tabla_de_varaible);
    }

    return codigo;
}
